// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/synchronization/waitable_event_watcher.h"

#include "base/compiler_specific.h"
#include "base/synchronization/waitable_event.h"
#include "base/win/object_watcher.h"

namespace base {

WaitableEventWatcher::WaitableEventWatcher()
    : event_(NULL)
{
}

WaitableEventWatcher::~WaitableEventWatcher()
{
}

bool WaitableEventWatcher::StartWatching(
    WaitableEvent* event,
    const EventCallback& callback)
{
    callback_ = callback;
    event_ = event;
    return watcher_.StartWatchingOnce(event->handle(), this);
}

void WaitableEventWatcher::StopWatching()
{
    callback_.Reset();
    event_ = NULL;
    watcher_.StopWatching();
}

WaitableEvent* WaitableEventWatcher::GetWatchedEvent()
{
    return event_;
}

void WaitableEventWatcher::OnObjectSignaled(HANDLE h)
{
    WaitableEvent* event = event_;
    EventCallback callback = callback_;
    event_ = NULL;
    callback_.Reset();
    DCHECK(event);

    callback.Run(event);
}

} // namespace base
